#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *给你两个单词 word1 和 word2， 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作：

插入一个字符
删除一个字符
替换一个字符
 

示例 1：

输入：word1 = "horse", word2 = "ros"
输出：3
解释：
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
示例 2：

输入：word1 = "intention", word2 = "execution"
输出：5
解释：
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/edit-distance
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */

///dp[i][j] 表示以下标i-1为结尾的字符串word1，和以下标j-1为结尾的字符串word2，最近编辑距离为
//dp[i][j]
//dp[i][j] 代表 字符串 i 和 j
//dp[i][j] 代表 字符串 i 和 j
int minDistance(string word1, string word2) {
//dp[i][j] 表示以下标i-1为结尾的字符串word1，和以下标j-1为结尾的字符串word2，最近编辑距离为 dp[i][j]
    vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));

//这俩是 如果为空串的时候
    for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
    for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;

    for (int i = 1; i <= word1.size(); i++) {
        for (int j = 1; j <= word2.size(); j++) {
            //如果这俩下相同跟前一个相同
            if (word1[i - 1] == word2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1];
            } else {
                //如果不相同
                //1 2 4
                //1 2 3 4
                int a = dp[i][j - 1] + 1;//这个相对于来说是插入 或者删除 的
                //1 2 5 4
                //1 2 3 4
                //上面是i 下面是 j的
                int b = dp[i - 1][j] + 1;
                ///相当于替换的
                int c = dp[i - 1][j - 1] + 1;
                dp[i][j] = min({a, b, c});
            }


        }


    }

    return dp[word1.size()][word2.size()];

}